#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>

using namespace std;

class Livestock {
public:
  // 1. 有哪些牛参与了挤奶？
  vector<string> cows;

  // 2. 有多少条挤奶的规则？
  int rules;

  // 3. 有多少头 X 牛？
  vector<string> xCows;

  // 4. 有多少头 Y 牛？
  vector<string> yCows;

  // 5. 答案
  vector<string> answer;

  // 构造函数
  Livestock(const string &inputFilename) {
    ifstream ifs(inputFilename);
    cows = { "Bessie", "Buttercup", "Belinda", "Beatrice", "Bella", "Blue", "Betsy", "Sue" };
    ifs >> rules;
    int rulesCount = rules;

    while (rulesCount > 0) {
      // 读入每一条挤奶的规则
      string x;
      string rubbish;
      string y;
      ifs >> x;
      
      ifs >> rubbish; // must
      ifs >> rubbish; // be
      ifs >> rubbish; // milked
      ifs >> rubbish; // besides

      ifs >> y;
      xCows.push_back(x);
      yCows.push_back(y);

      --rulesCount;
    }

    answer = {};
  }

  // 判断 name 是否在 ans 里，如果在就返回 ans 中的索引位置，否则返回 -1。
  int getIndex(const string &name) {
    // vector<string>::iterator pos = find(answer.begin(), answer.end(), name);

    // if (pos == answer.end()) { return -1; }
    // else {
    //   return int(pos - answer.begin());
    // }

    for (int i = 0; i < answer.size(); ++i) {
      if (answer[i] == name) {
        return i;
      }
    }

    return -1;
  }

  // 判断名字为 name 的奶牛是否可以被选择出来放到 answer 里。
  bool canBePickedUp(const string &name) {
    if (getIndex(name) != -1) {
      // name 已经在 answer 里了，不能再次选择。
      return false;
    }

    // name 牛的邻居
    // 必须挨在一起挤奶的牛叫做邻居
    /*
    Buttercup must be milked beside Bella
    Blue must be milked beside Bella
    Sue must be milked beside Beatrice

    Buttercut Bella Blue -> Bella 的邻居数等于 2
                         -> Buttercut 的邻居数等于 1
                         -> Blue 的邻居数等于 1
    */
    int nbr = 0; // 邻居

    for (int i = 0; i < rules; ++i) {
      // 遍历每一条规则，计算邻居数量
      // 如果 xCows[i] == name
      if (xCows[i] == name && getIndex(yCows[i]) == -1) {
        ++nbr; // 说明 name 有一个不在 answer 中的邻居
      }

      if (yCows[i] == name && getIndex(xCows[i]) == - 1) {
        ++nbr; // 说明 name 有另外一个不在 answer 中的邻居
      }
    }

    if (nbr == 2) {
      // name 有两个不在 answer 里的邻居
      return false;
    }

    // 如果 answer 是空的
    if (answer.size() != 0) {
      // 进一步判断
      // XXXXXXX yCows[i] xCows[i]
      for (int i = 0; i < rules; ++i) {
        if (answer.back() == xCows[i] && getIndex(yCows[i]) == -1 && yCows[i] != name) {
          return false;
        }
      
        if (answer.back() == yCows[i] && getIndex(xCows[i]) == -1 && xCows[i] != name) {
          return false;
        }
      }
    }
    
    return true;
  }

  /*
            vi=1
  Beatrice, Belinda, Bella, Bessie, Betsy, Blue, Buttercup, Sue
  ^nextCow
  
  [Beatrice, ]
  */
  void solution() {
    // 1. 遍历 cows，遍历每一头牛的名字
    for (int i = 0; i < cows.size(); ++i) {
      int nextCow = 0; // 接下来可以被选择的牛的索引

      while(!canBePickedUp(cows[nextCow])) {
        ++nextCow;
      }

      // 2. 如果可以被选择出来，就把它放到 answer 里
      answer.push_back(cows[nextCow]);
    }

    // answer 中就是我们要的答案了。
  }
};

int main(int argc, char const *argv[])
{
  /* code */
  Livestock ls("lineup.in");
  ls.solution();

  for (string name : ls.answer) {
    cout << name << " ";
  }
  cout << endl;

  return 0;
}
